home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: MEMORIA.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- internas y externas para la gestión de memoria VMS, XMS y EMS.
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdlib.h>
- #include <stdio.h>
- #include <alloc.h>
- #include <string.h>
-
- #include "global.h"
- #include "memoria.h"
- #include "error.h"
-
- /*---- VARIABLES LOCALES -----------------------------------------------------*/
-
- /* tipo de memoria actual */
- static int MEMTipo;
-
- /* direccion del marco de pagina para EMS */
- static char *EMSmarco_pagina;
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
-
- /*---- FUNCION: extern int MEMSeleccionar(int tipo) ----------------------------
-
- Descripción:
-
- Esta función selecciona el tipo de memoria a usar por la aplicación
- Actualiza la variable MEMtipo
-
- Parámetros:
-
- int tipo: opcion de memoria.
-
- Retorno:
-
- - tipo de memoria
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MEMSeleccionar(int tipo)
- {
- switch(tipo)
- {
- case OPEMS: MEMTipo = EMS;break;
- case OPXMS: MEMTipo = XMS;break;
- case OPVMS: MEMTipo = VMS;break;
- }
- return(MEMTipo);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern IMAGEN *MEMreservarCAB(IMAGEN *c) -----------------------
-
- Descripción:
-
- Esta función reserva memoria convencional para los datos de cabecera
- de una imagen
-
- Parámetros:
-
- IMAGEN *c: Puntero a la imagen.
-
- Retorno:
-
- - Puntero a la imagen reservada
- - Si hubo error, NULL.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *MEMreservarCAB(IMAGEN *c)
- {
- return(c = (IMAGEN *)malloc(sizeof(IMAGEN)));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern IMAGEN *MEMreservar(IMAGEN *c) --------------------------
-
- Descripción:
-
- Esta función reserva memoria EMS, XMS o VMS para alojar una imagen.
- Los datos de la imagen se encuentran en la estructura apuntada por
- el puntero que se pasa como parámetro.
-
- Parámetros:
-
- IMAGEN *c: Puntero a la cabecera de la imagen.
-
- Retorno:
-
- - Puntero a estructura de la imagen
- - Si no hay memoria, se libera la cabecera y se devuelve NULL
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *MEMreservar(IMAGEN *c)
- {
- /* contador */
- int i;
- /* página y desplazamiento para EMS */
- unsigned int pagina=0,despl=0;
- /* tamaño para XMS */
- long tam;
-
- /* si es demasiado grande */
- if(c->bytes > ANCHO_MAXIMO)
- {
- c=MEMliberar(c);
- return(c);
- }
-
- /* reservar memoria para la imagen */
- switch(MEMTipo)
- {
- /* memoria expandida LIM/EMS */
- case EMS:
- /* si está disponible...*/
- if(EMSmemIniciar())
- {
- /* obtener mrco de página */
- EMSmarco_pagina = EMSMarcoPagina();
- /* reservar memoria para la tabla de gestión de la memoria EMS */
- if((c->mem.ems.tabla=(unsigned int *)malloc(2*(c->alto)*sizeof(int)))!=NULL)
- {
- /* llenar la tabla */
- for(i=0;i<c->alto;++i)
- {
- if(despl+c->bytes >= EMSTamPagina)
- {
- pagina++;
- despl=0;
- }
- /* asignar a cada línea una página y su desplazamiento en ella */
- c->mem.ems.tabla[i*2]=pagina;
- c->mem.ems.tabla[i*2+1]=despl;
- despl+=c->bytes;
- }
- }
- else
- {
- c = MEMliberar(c);
- return(c);
- }
- /* reservar las páginas de memoria requeridas */
- if((c->mem.ems.gestor=EMSmemReservar(pagina+1))==0)
- c = MEMliberar(c);
- return(c);
- }
- else
- {
- c = MEMliberar(c);
- ERRORponer(ERRnoMemoria);
- return(c);
- }
- break;
-
- /* memoria extendida XMS */
- case XMS:
- c->mem.xms = -1;
- /* calcular Kbytes a reservar */
- tam = (((long)c->bytes * (long)(c->alto))/1024L)+1;
- /* obtener version 2.0 o posterior */
- i = XMSmemIniciar();
- /* si está disponible... reservar */
- if(i >= 0x0200 && i != -1)
- c->mem.xms = XMSmemReservar((int)tam);
- /* si error, liberar */
- if(c->mem.xms == -1)
- {
- c = MEMliberar(c);
- ERRORponer(ERRnoMemoria);
- }
- return(c);
-
- /* memoria virtual VMS */
- case VMS:
- /* calcular tamaño del fichero */
- tam = (long)(c->bytes) * (long)(c->alto);
- /* reservar */
- c->mem.vms = *(VMSmemoria *)VMSmemReservar(tam);
- if(c->mem.vms.gestor == NULL)
- {
- c = MEMliberar(c);
- ERRORponer(ERRnoMemoria);
- }
- return(c);
-
- default:
- c = MEMliberar(c);
- return(c);
- };
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern IMAGEN *MEMliberar(IMAGEN *c) ---------------------------
-
- Descripción:
-
- Esta función libera la memoria convencional apuntada por el puntero
- que se pasa como parámetro, también libera si la hubiese la memoria
- EMS, XMS o VMS reservada para la imagen.
-
- Parámetros:
-
- IMAGEN *c: Puntero a la cabecera de la imagen.
-
- Retorno:
-
- - Puntero a NULL
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern IMAGEN *MEMliberar(IMAGEN *c)
- {
- if(c!=NULL)
- {
- switch(MEMTipo)
- {
- case EMS:
- /* si hay imagen, liberarla */
- if(c->mem.ems.tabla !=NULL)
- {
- free(c->mem.ems.tabla);
- c->mem.ems.tabla=NULL;
- EMSmemLiberar(c->mem.ems.gestor);
- }
- break;
- /* si hay imagen, liberarla */
- case XMS:
- if(c->mem.xms != -1)
- {
- XMSmemLiberar(c->mem.xms);
- c->mem.xms = -1;
- }
- break;
-
- /* si hay imagen, liberarla */
- case VMS:
- if(c->mem.vms.gestor!=NULL)
- VMSmemLiberar(c->mem.vms);
- break;
- }
- /* liberar cabecera */
- free(c);
- c = NULL;
- }
- return(c);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MEMleer(char *buffer,int n,IMAGEN *c) ---------------
-
- Descripción:
-
- Esta función copia en un buffer una línea de la imagen desde
- la memoria EMS, XMS o VMS.
-
- Parámetros:
-
- char *buffer: Buffer donde se copiará la línea
- int n: línea a copiar
- IMAGEN *c: Puntero a la imagen.
-
- Retorno:
-
- - 1 si la copió
- - 0 si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MEMleer(char *buffer,int n,IMAGEN *c)
- {
- /* bloque para mover la memoria XMS */
- XMSbloque bloque;
-
- switch(MEMTipo)
- {
- case EMS:
- /* mapear a pagina fisica la pagina de la linea n */
- if(!EMSmemMapear(c->mem.ems.gestor,0,c->mem.ems.tabla[n*2]))
- return(0);
- /* copiar la linea en el buffer */
- memcpy(buffer,EMSmarco_pagina+c->mem.ems.tabla[n*2+1],c->bytes);
- return(1);
-
- case XMS:
- /* mover el bloque */
- bloque.longitud = (long)c->bytes;
- bloque.fuente = c->mem.xms;
- bloque.desp_fuente = (long)n * (long)c->bytes;
- bloque.destino = 0;
- bloque.desp_destino = PunteroALong(buffer);
- if(!XMSmemMover(&bloque))
- return(0);
- break;
-
- case VMS:
- /* posicionar y leer del fichero */
- fseek(c->mem.vms.gestor,(long)n*(long)(c->bytes),SEEK_SET);
- fread(buffer,c->bytes,1,c->mem.vms.gestor);
- break;
- }
- return(1);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int MEMescribir(char *buffer,int n,IMAGEN *c) -----------
-
- Descripción:
-
- Esta función copia desde un buffer una línea de la imagen a
- la memoria EMS, XMS o VMS.
-
- Parámetros:
-
- char *buffer: Buffer donde se encuentra la línea
- int n: línea a copiar
- IMAGEN *c: Puntero a la imagen.
-
- Retorno:
-
- - 1 si la copió
- - 0 si hubo error
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int MEMescribir(char *buffer,int n,IMAGEN *c)
- {
- /* bloque para mover la memoria XMS */
- XMSbloque bloque;
-
- switch(MEMTipo)
- {
- case EMS:
- /* mapear a pagina fisica la pagina de la linea n */
- if(!EMSmemMapear(c->mem.ems.gestor,0,c->mem.ems.tabla[n*2]))
- return(0);
- /* copiar el buffer en la linea n */
- memcpy(EMSmarco_pagina+c->mem.ems.tabla[n*2+1],buffer,c->bytes);
- break;
- case XMS:
- /* mover bloque */
- bloque.longitud = (long)c->bytes;
- bloque.fuente = 0;
- bloque.desp_fuente = PunteroALong(buffer);
- bloque.destino = c->mem.xms;
- bloque.desp_destino = (long)n * (long)c->bytes;
- if(!XMSmemMover(&bloque))
- return(0);
- else
- return(1);
- break;
- case VMS:
- /* posicionar y escribir en el fichero */
- if(!fseek(c->mem.vms.gestor,(long)n*(long)(c->bytes),SEEK_SET))
- {
- fwrite(buffer,c->bytes,1,c->mem.vms.gestor);
- return(1);
- }
- else
- return(0);
- break;
- }
- return(0);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-